import axios from 'axios'
import qs from 'qs'
import Vue from 'vue'
import router from '@/router'
import store from '@/store';

import { renderUrl } from './config'

// 全局配置
// axios.defaults.timeout = 10 * 1000
// axios.defaults.baseURL = ''

const api = axios.create({
  baseURL: process.env.API_LOCATION || '', // 默认url
  timeout: 60 * 1000, // 超时时间
  headers: {
    'Content-Type': 'application/json'
  }
})

// todo  做第一个contentPath /first   解析，通过解析第一个content  config去配置
function dealMserver (url) {
  let rs = url

  if (/(^\/\/|https?\:\/\/\S+)/ig.test(url)) { // https &  //  绝对路径

  } else { // path  content 根据第一个进行判断
    const np = String(url).split('\/')[1] || '' //  ['',path,...]  [1]
    if (np) {
      rs = renderUrl(np) + rs
    }
  }

  return rs
}

// 请求拦截
api.interceptors.request.use(
  apiconfig => {
    apiconfig.headers.Authorization = Vue.cookie.get('access_token') // set token
    apiconfig.headers['Content-Type'] = 'application/json;charset=UTF-8'
    apiconfig.url = dealMserver(apiconfig.url)
    return apiconfig
  },
  e => {
    Promise.reject(e)
  }
)

// 响应拦截
api.interceptors.response.use(
  (res = {}) => {
    const status = res.status
    const code = res.data.code || ''

    // 判断是否加载是否要loading
    if (status !== 200) { return false }

    if (
      res.headers['content-type'] &&
      res.headers['content-type'].indexOf('application/x-download') !== -1
    ) {
      return res
    }
    if (res.config && res.config.responseType === 'arraybuffer') {
      return res
    }

    switch (code) {
    case 200:
      return Promise.resolve(res.data)

      // 没有登录
    case 401:
        store.dispatch("admin/account/logout")
        break
        // 没权限
    case 403:
        router.push("/403")
      break
    default:
      return res.data
    }
    return Promise.reject(res)
  },
  e => {
    if (e.response) {
      switch (e.response.status) {
      // case 502:
      //   Message.error('服务器内部错误')
      //   break
      // case 404:
      //   Message.error('请求地址错误')
      //   break
      // case 405:
      //   Message.error('请求方式错误')
      //   break
      // default:
      //   Message.error('服务器繁忙')
      //   break
      }
    } else {
      // Message.error('网络错误')
    }
    return Promise.reject(e.response)
  }
)


// 设置返回码转义
// const STATUSTIP = {
//   '401': '未登录',
//   '403': '没权限'
// }

// 增加全局参数
function addCommonParam (params) {
  return { ...params, r: new Date().getTime() }
}

export default {
  api,
  // get请求
  get (url, param) {
    return new Promise((resolve, reject) => {
      const ex = addCommonParam(param) || {}
      api({
        method: 'get',
        url: `${url}?${qs.stringify(ex)}`
      }).then(res => {
        resolve(res)
      }).catch(err => {
        reject(err)
      })
    })
  },

  // post请求
  post (url, param) {
    return new Promise((resolve, reject) => {
      const ex = addCommonParam(param) || {}
      api({
        method: 'post',
        url,
        data: ex
      }).then(res => {
        resolve(res)
      }).catch(err => {
        reject(err)
      })
    })
  },

  // Promise.all
  $res (arr) {
    return Promise.all(arr)
  }
}
